#include "log.hpp"
#include "Socket.hpp"
#include "tcp_server.hpp"
#include "Protocal.hpp"
#include "servercal.hpp"
#include "Daemon.hpp"
using namespace std;

static void usage(const string &procname)
{
    cout << "\nusage: " << procname << " port\n"
         << endl;
}
int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        usage(argv[0]);
        exit(0);
    }
    uint16_t port = stoi(argv[1]);
    ServerCal cal;
    // bind的作用就是把 “成员函数” 和 “对象” 绑定在一起，生成一个 “可直接调用的函数对象”，
    // 让 TCPServer 可以像调用普通函数一样，间接调用cal对象的calculator方法。
    // 绑定语法拆解：std::bind(&ServerCal::calculator, &cal, std::placeholders::_1)
    // 第一个参数 &ServerCal::calculator：要绑定的成员函数地址（告诉 bind “要绑定哪个函数”）。
    // 第二个参数 &cal：要绑定的对象地址（告诉 bind “这个成员函数属于哪个对象”，后续调用时会用这个对象调用 calculator）。
    // 第三个参数 std::placeholders::_1：“占位符”，表示这个位置的参数在调用时再传入
    //（因为 calculator 需要一个string&参数，这个参数要等 TCPServer 收到客户端数据后才会传入，所以先用_1占位置）。
    TCPServer *tsvr = new TCPServer(8080, std::bind(&ServerCal::calculator, &cal, std::placeholders::_1));
    tsvr->init();// 初始化服务器（创建 socket、绑定、监听）
    // Daemon();
    daemon(0, 0);// 转为后台进程（daemon）
    tsvr->start();// 启动服务器，开始处理客户端请求
    return 0;
}